<?php

namespace app\admin\service;

use app\common\model\Menu;

class TreeService
{
    //递归
    // $parentId 参数代表要获取子类目的父类目 ID，null 代表获取所有根类目
    // $allCategories 参数代表数据库中所有的类目，如果是 null 代表需要从数据库中查询
    public function getMenuTree($parentId = null, $allMenus = null)
    {
        if (is_null($allMenus)) {
            if (session('menu_auth') == 'all') {
                $allMenus = Menu::where(['is_hide' => 0])->all();
            } else {
                $allMenus = Menu::where(['is_hide' => 0])->where('id', 'in', session('menu_auth'))->all();
            }
        }
        return $allMenus
            // 从所有类目中挑选出父类目 ID 为 $parentId 的类目
            ->where('parent_id', $parentId)
            // 遍历这些类目，并用返回值构建一个新的集合
            ->map(function (Menu $menu) use ($allMenus) {
                $data = ['id' => $menu->id, 'name' => $menu->name, 'jump_url' => $menu->jump_url, 'icon_name' => $menu->icon_name];
                // 如果当前类目不是父类目，则直接返回
                if (!$menu->is_directory) {
                    return $data;
                }
                // 否则递归调用本方法，将返回值放入 children 字段中
                $data['children'] = $this->getMenuTree($menu->id, $allMenus);
                return $data;
            });
    }

    //左侧menu html
    public function getMenuHtml($menuTree)
    {
        $menuHtml = '';
        if (!$menuTree) {
            return '';
        }
        foreach ($menuTree as $v) {
            if (isset($v['children']) && count($v['children'])) {
                $menuHtml .= '<li>';
                $menuHtml .= '<a data-submenu= "'.$v['id'] .'" href="javascript:void(0)" class="dropdown-toggle">';
                $menuHtml .= '<i class="menu-icon fa fa-' . $v['icon_name'] . '"></i>';
                $menuHtml .= '<span class="menu-text nav-label">' . $v['name'] . '</span >';
                $menuHtml .= '<b class="arrow fa fa-angle-down"></b>';
                $menuHtml .= '</a >';
                $menuHtml .= '<b class="arrow"></b>';
                $menuHtml .= '<ul class="submenu">';
                $menuHtml .= $this->getMenuHtml($v['children']);
                $menuHtml .= '</ul>';
                $menuHtml .= '</li>';;
            } else {
                $menuHtml .= '<li id= "child' . $v['id'] . '" >';
                $menuHtml .= '<a href=/admin' . $v['jump_url'] . '>';
                $menuHtml .= '<i class="menu-icon fa fa-' . $v['icon_name'] . '"></i>';
                $menuHtml .= '<span class="menu-text">' . $v['name'] . '</span>';
                $menuHtml .= '</a>';
                $menuHtml .= '<b class="arrow"></b>';
                $menuHtml .= '</li>';
            }
        }
        return $menuHtml;
    }

    //菜单列表
    public function getMenuList($allMenus = null, $pid = null, $step = 0, $empty = "&nbsp;&nbsp;&nbsp;&nbsp;")
    {
        global $tree;
        if (is_null($allMenus)) {
            $allMenus = Menu::all();
        }
        foreach ($allMenus as $key => $val) {
            if ($val['parent_id'] == $pid) {
                $flg = str_repeat($empty, $step) . str_repeat(' ├─ ', $step);
                $val['name'] = $flg . $val['name'];
                $tree[] = $val;
                $this->getMenuList($allMenus, $val['id'], $step + 1);
            }
        }
        return $tree;
    }


}
